home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_11_05 / test_obj / dgen.c < prev    next >
C/C++ Source or Header  |  1993-01-20  |  35KB  |  1,254 lines

  1. /*
  2.  AnaGram Parsing Engine
  3.  Copyright (c) 1992, Jerome T. Holland.
  4.  All Rights Reserved.
  5. */
  6.  
  7.  
  8. /*  Line 39, D:\C_USR_J\DISTRIB\DGEN.SYN */
  9. #include "tutils.h"
  10.  
  11. #include "dgen.h"
  12. #include <ctype.h>
  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include <string.h>
  16.  
  17. #define RULE_CONTEXT (&((PCB).cs[(PCB).ssx]))
  18. #define ERROR_CONTEXT ((PCB).cs[(PCB).error_frame_ssx])
  19. #define CONTEXT ((PCB).cs[(PCB).ssx])
  20.  
  21.  
  22. #ifndef NEAR
  23. #define NEAR near
  24. #endif
  25. #ifndef LOCUS
  26. #define LOCUS near
  27. #endif
  28. #ifndef VOID
  29. #define VOID void
  30. #endif
  31. #ifndef CONST
  32. #define CONST const
  33. #endif
  34. #ifndef CONVERT_CASE(c)
  35. #define CONVERT_CASE(c) (c)
  36. #endif
  37. #ifndef TAB_SPACING
  38. #define TAB_SPACING 8
  39. #endif
  40. #define AG_INIT_PARSE() VOID init_dgen(VOID)
  41. #define AG_PARSE() VOID dgen(VOID)
  42. #define AG_INITIALIZE() init_dgen()
  43. #define AG_PARSER_STACK_SIZE     32
  44.  
  45. dgen_pcb_type dgen_pcb;
  46. #define PCB dgen_pcb
  47.  
  48.  
  49. #ifndef DGEN_H
  50. #include "dgen.h"
  51. #endif
  52.  
  53.  
  54. static char * NEAR ag_rp_1(VOID) {
  55. /* Line 63 */
  56.   return release();
  57. }
  58.  
  59. static VOID NEAR ag_rp_2(int c) {
  60. /* Line 65 */
  61.   collectFirst(c);
  62. }
  63.  
  64. static VOID NEAR ag_rp_3(int c) {
  65. /* Line 67 */
  66.   collect(c);
  67. }
  68.  
  69. static VOID NEAR ag_rp_4(int c) {
  70. /* Line 68 */
  71.   collect(c);
  72. }
  73.  
  74. static char * NEAR ag_rp_5(VOID) {
  75. /* Line 71 */
  76.   return release();
  77. }
  78.  
  79. static VOID NEAR ag_rp_6(int c) {
  80. /* Line 73 */
  81.   collectFirst(c);
  82. }
  83.  
  84. static VOID NEAR ag_rp_7(int c) {
  85. /* Line 75 */
  86.   collect(c);
  87. }
  88.  
  89. static char * NEAR ag_rp_8(VOID) {
  90. /* Line 83 */
  91. collect('}');return(release());
  92. }
  93.  
  94. static VOID NEAR ag_rp_9(VOID) {
  95. /* Line 85 */
  96.   collectFirst('{');
  97. }
  98.  
  99. static VOID NEAR ag_rp_10(int c) {
  100. /* Line 87 */
  101.   collect(c);
  102. }
  103.  
  104. static VOID NEAR ag_rp_11(VOID) {
  105. /* Line 91 */
  106.   collect('}');
  107. }
  108.  
  109. static VOID NEAR ag_rp_12(VOID) {
  110. /* Line 93 */
  111.   collect('{');
  112. }
  113.  
  114. static struct STRLIST * NEAR ag_rp_13(char * s) {
  115. /* Line 95 */
  116.   return listNew(s,"");
  117. }
  118.  
  119. static struct STRLIST * NEAR ag_rp_14(struct STRLIST * lst, char * s) {
  120. /* Line 96 */
  121.   return listAdd(lst,s,"");
  122. }
  123.  
  124. static char * NEAR ag_rp_15(VOID) {
  125. /* Line 99 */
  126.   return release();
  127. }
  128.  
  129. static VOID NEAR ag_rp_16(int c) {
  130. /* Line 101 */
  131.   collectFirst(c);
  132. }
  133.  
  134. static VOID NEAR ag_rp_17(int c) {
  135. /* Line 103 */
  136.   collect(c);
  137. }
  138.  
  139. static VOID NEAR ag_rp_18(VOID) {
  140. /* Line 107 */
  141.   writeDriver();
  142. }
  143.  
  144. static VOID NEAR ag_rp_19(char * eb) {
  145. /* Line 116 */
  146.   addBlock(eb);
  147. }
  148.  
  149. static VOID NEAR ag_rp_20(char * n) {
  150. /* Line 130 */
  151.   setRunName(n);
  152. }
  153.  
  154. static VOID NEAR ag_rp_21(struct STRLIST * vl, char * b) {
  155. /* Line 133 */
  156.   makeVary(vl,b);
  157. }
  158.  
  159. static VOID NEAR ag_rp_22(struct STRLIST * vl, char * b) {
  160. /* Line 135 */
  161.   makeComb(vl,b);
  162. }
  163.  
  164. static struct STRLIST * NEAR ag_rp_23(char * v) {
  165. /* Line 137 */
  166.   return listNew(v,"");
  167. }
  168.  
  169. static struct STRLIST * NEAR ag_rp_24(struct STRLIST * lst, char * v) {
  170. /* Line 139 */
  171.   return listAdd(lst,v,"");
  172. }
  173.  
  174. static VOID NEAR ag_rp_25(struct STRLIST * vl, struct STRLIST * il) {
  175. /* Line 160 */
  176.   addTVars(vl,"char","char",il);
  177. }
  178.  
  179. static VOID NEAR ag_rp_26(struct STRLIST * vl, struct STRLIST * il) {
  180. /* Line 169 */
  181.   addTVars(vl,"char *","char *",il);
  182. }
  183.  
  184. static VOID NEAR ag_rp_27(struct STRLIST * vl, struct STRLIST * il) {
  185. /* Line 178 */
  186.   addTVars(vl,"int","int",il);
  187. }
  188.  
  189. static VOID NEAR ag_rp_28(struct STRLIST * vl, struct STRLIST * il) {
  190. /* Line 187 */
  191.   addTVars(vl,"double","double&",il);
  192. }
  193.  
  194. static VOID NEAR ag_rp_29(struct STRLIST * vl, struct STRLIST * il) {
  195. /* Line 196 */
  196.   addTVars(vl,"FILE *","FILE *",il);
  197. }
  198.  
  199. static VOID NEAR ag_rp_30(struct STRLIST * vl, struct STRLIST * il) {
  200. /* Line 207 */
  201.   addTVars(vl,"INTARR2","INTARR2",il);
  202. }
  203.  
  204. static VOID NEAR ag_rp_31(struct STRLIST * vl, struct STRLIST * il) {
  205. /* Line 216 */
  206.   addTVars(vl,"Item","Item&",il);
  207. }
  208.  
  209. static VOID NEAR ag_rp_32(struct STRLIST * vl, struct STRLIST * il) {
  210. /* Line 224 */
  211.   addTVars(vl,"Client","Client&",il);
  212. }
  213.  
  214. static VOID NEAR ag_rp_33(struct STRLIST * vl, struct STRLIST * il) {
  215. /* Line 232 */
  216.   addTVars(vl,"Invoice","Invoice&",il);
  217. }
  218. #define AG_TRACE_ERROR
  219. #define AG_VT dgen_pcb_type
  220. #define AG_COUNT_RULE(k)
  221. static dgen_vs_type ag_null_value;
  222. #define AG_INPUT_TYPE int
  223. #define AG_TOKEN_TYPE dgen_token_type
  224. #define AG_VALUE_STACK_TYPE dgen_vs_type
  225. #define AG_INPUT_VALUE CONVERT_CASE(*PCB.lab)
  226. #define AG_INPUT_CODE (*PCB.lab)
  227. #define V(i,t) (*(t *) (&(PCB).vs[(PCB).ssx + i]))
  228. #define VS(i) (PCB).vs[(PCB).ssx + i]
  229.  
  230. #ifndef AG_GET_VALUE
  231. #define AG_GET_VALUE AG_INPUT = AG_INPUT_VALUE
  232. #endif
  233.  
  234. #ifndef GET_CONTEXT
  235. #define GET_CONTEXT CONTEXT = (PCB).input_context
  236. #endif
  237.  
  238. #ifndef AG_NULL
  239. #define AG_NULL (PCB).vs[(PCB).ssx] = ag_null_value
  240. #endif
  241.  
  242. #ifdef AG_CONTEXT_TYPE
  243. #define AG_SAVE_CONTEXT {GET_CONTEXT;}
  244. #define AG_SWAP_CONTEXT(k1,k2) (PCB).cs[k1] = (PCB).cs[k2]
  245. #endif
  246.  
  247. #ifndef AG_SAVE_CONTEXT
  248. #define AG_SAVE_CONTEXT
  249. #define AG_SWAP_CONTEXT(k1,k2)
  250. #endif
  251.  
  252. typedef enum {
  253.   ag_shift_accept,
  254.   ag_go_to,
  255.   ag_shift_reduce,
  256.   ag_shift_simple_reduce,
  257.   ag_reduce_form,
  258.   ag_simple_reduce,
  259.   ag_accept,
  260.   ag_syn_error,
  261.   ag_null_go_to,
  262.   ag_skip,
  263.   ag_skip_reduce,
  264.   ag_recover
  265. } ag_parser_action;
  266.  
  267. static int ag_ap;
  268.  
  269.  
  270. #define AG_VALUE
  271. #define AG_INPUT (*(int *) &PCB.vs[PCB.ssx])
  272.  
  273. static CONST unsigned char ag_rpx[] = {
  274.     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,
  275.     0,  0,  0,  0,  8,  9, 10,  0, 11, 12, 13, 14,  0,  0,  0,  0, 15, 16,
  276.    17,  0,  0, 18,  0,  0,  0, 19,  0, 20, 21, 22, 23, 24,  0,  0,  0,  0,
  277.     0,  0,  0,  0,  0, 25, 26, 27, 28, 29, 30, 31, 32, 33
  278. };
  279.  
  280. static unsigned char ag_key_itt[] = {
  281.   0
  282. };
  283.  
  284. static unsigned short ag_key_pt[] = {
  285. 0
  286. };
  287.  
  288. #define AG_KEY
  289. static unsigned char ag_key_ch[] = {
  290.     0,110,116,255, 97,255,116,255,110,255, 47, 67, 70, 73, 99,100,105,114,
  291.   115,255,110,116,255, 97,255,116,255,110,255, 47, 67, 70, 73, 99,100,105,
  292.   114,115,125,255,110,116,255, 97,255,116,255,110,255, 67, 70, 73, 99,100,
  293.   105,114,115,255, 47,255, 47, 99,118,255,123,255, 47,123,255,125,255, 47,
  294.   125,255
  295. };
  296.  
  297. static unsigned char ag_key_act[] = {
  298.   0,3,3,4,3,4,1,4,2,4,3,3,3,2,3,3,2,3,3,4,3,3,4,3,4,1,4,2,4,3,3,3,2,3,3,
  299.   2,3,3,0,4,3,3,4,3,4,1,4,2,4,3,3,2,3,3,2,3,3,4,3,4,3,3,3,4,0,4,3,0,4,0,
  300.   4,3,0,4
  301. };
  302.  
  303. static unsigned char ag_key_parm[] = {
  304.     0, 69, 67,  0, 66,  0, 63,  0,  0,  0,  5, 68, 65,  0, 59, 64,  0, 46,
  305.    62,  0, 69, 67,  0, 66,  0, 63,  0,  0,  0,  5, 68, 65,  0, 59, 64,  0,
  306.    46, 62, 61,  0, 69, 67,  0, 66,  0, 63,  0,  0,  0, 68, 65,  0, 59, 64,
  307.     0, 46, 62,  0,  5,  0,  5, 49, 47,  0, 60,  0,  5, 60,  0, 61,  0,  5,
  308.    61,  0
  309. };
  310.  
  311. static unsigned char ag_key_jmp[] = {
  312.     0, 12, 18,  0, 31,  0,  4,  0,  6,  0,  0,  2,  8,  1, 21, 25,  8, 35,
  313.    42,  0, 60, 66,  0, 79,  0, 23,  0, 25,  0, 48, 50, 56, 20, 69, 73, 27,
  314.    83, 90,  0,  0,106,112,  0,125,  0, 43,  0, 45,  0, 96,102, 40,115,119,
  315.    47,129,136,  0,142,  0,144,146,155,  0,  0,  0,162,  0,  0,  0,  0,164,
  316.     0,  0
  317. };
  318.  
  319. static unsigned char ag_key_index[] = {
  320.    10,  0, 29, 49,  0,  0, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,  0, 58,
  321.    10, 10, 10, 49, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,  0,  0,  0, 60,
  322.    58, 58, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0,  0, 58, 58, 58, 66, 58,
  323.    58, 58, 58, 58, 58, 58, 58, 58, 58,  0, 58, 58,  0, 66,  0,  0,  0,  0,
  324.     0,  0,  0,  0,  0,  0,  0, 69, 69, 69, 69, 69, 69, 69, 69, 69,  0, 71
  325. };
  326.  
  327. static unsigned char ag_key_ends[] = {
  328. 47,0, 108,105,101,110,116,0, 73,76,69,0, 118,111,105,99,101,0, 
  329. 101,109,0, 104,97,114,0, 111,117,98,108,101,0, 114,114,50,0, 
  330. 117,110,116,101,115,116,0, 116,114,105,110,103,0, 47,0, 
  331. 108,105,101,110,116,0, 73,76,69,0, 118,111,105,99,101,0, 101,109,0, 
  332. 104,97,114,0, 111,117,98,108,101,0, 114,114,50,0, 
  333. 117,110,116,101,115,116,0, 116,114,105,110,103,0, 108,105,101,110,116,0, 
  334. 73,76,69,0, 118,111,105,99,101,0, 101,109,0, 104,97,114,0, 
  335. 111,117,98,108,101,0, 114,114,50,0, 117,110,116,101,115,116,0, 
  336. 116,114,105,110,103,0, 47,0, 47,0, 111,109,98,105,110,105,110,103,0, 
  337. 97,114,121,105,110,103,0, 47,0, 47,0, 
  338. };
  339. #define AG_TCV(x) (((int)(x) >= -1 && (int)(x) <= 255)